/**
 * @file makeStrins.js
 * @author zhangLuping <zhuangluping@Antiy.cn>
 * @createTime 2018-01-23 13:46:07
 * @description summary用于详情页描述 & oneString用于日志主table
 */

/**
 * @description 判断属性是否存在
 * @param {any} ele
 * @returns {Boolean}
 */
const isNone = ele => {
  // var a = {c:''};  String
  // var b = {c:null};  Null
  // var d = {}; Undefined
  // var f = {c: {}} Object
  let _type = Object.prototype.toString.call(ele).slice(8, -1)
  return _type === 'Undefined' || _type === 'Null'
}
function transformNone (data) {
  return isNone(data) ? '' : data
}
/**
 * @description 获取系统节点名称或系统名称,_name不传参默认获取系统节点名称
 * @param {any} data
 * @param {String} _name
 * @returns {String}
 */
function getName (data, _name = 'node') {
  let sysName = !isNone(data.sys_info) ? data.sys_info.name : ''
  let nodeName = !isNone(data.node_info) ? data.node_info.name : ''
  if (_name === 'sys') {
    return sysName
  } else return nodeName
}

// // data 结构 = [{}] data[0] 字段不一定存在，防止报错
// function deal (data, key) {
//   data = data === undefined ? [] : data
//   return isNone(data[0]) ? '' : data[key]
// }
const desConfig = [
  {
    useKey: 'stype',
    useValue: 'WF',
    name: '防火墙检测',
    summary: function (data) {
      return `${getName(data, 'sys')}存在${this.name}问题`
    },
    oneString: function (data) {
      return ` ${transformNone(data.sip)} 通过${transformNone(data.proto)}协议，访问资产(${transformNone(data.dip)})，处置动作：${data.action === 'deny' ? '拒绝' : '允许'}`
    }
  },
  {
    useKey: 'stype',
    useValue: 'WAF',
    name: 'WEB应用防火墙',
    summary: function (data) {
      return `${getName(data, 'sys')}存在${this.name}问题`
    },
    oneString: function (data) {
      return ` ${transformNone(data.sip)} 向资产(${transformNone(data.dip)})发起 ${transformNone(data.tag)}，处置动作：${data.action === 'deny' ? '拒绝' : '允许'}`
    }
  },
  {
    useKey: 'stype',
    useValue: 'IDS',
    name: '入侵检测',
    summary: function (data) {
      return `${getName(data, 'sys')}存在${this.name}问题`
    },
    oneString: function (data) {
      return `发现 ${transformNone(data.sip)} 通过${transformNone(data.proto)}协议，对资产(${transformNone(data.dip)})发起网络入侵攻击，${transformNone(data.desc)}`
    }
  },
  {
    useKey: 'stype',
    useValue: 'IPS',
    name: '入侵防御',
    summary: function (data) {
      return `${getName(data, 'sys')}存在${this.name}问题`
    },
    oneString: function (data) {
      return `发现 ${transformNone(data.sip)} 通过${transformNone(data.proto)}协议，对资产(${transformNone(data.dip)})发起网络入侵攻击，处置动作：${data.action === 'deny' ? '拒绝' : '允许'}`
    }
  },
  {
    useKey: 'stype',
    useValue: 'MALWARE',
    name: '恶意代码检测',
    summary: function (data) {
      return `${getName(data, 'sys')}存在${this.name}问题`
    },
    oneString: function (data) {
      return `发现资产(${transformNone(data.host)})存在恶意代码 ${transformNone(data.md5)}，病毒名称为 ${transformNone(data.malname)}`
    }
  },
  {
    useKey: 'stype',
    useValue: 'C2',
    name: 'C&C通讯',
    summary: function (data) {
      return `${getName(data, 'sys')}存在${this.name}问题`
    },
    oneString: function (data) {
      return `发现C&C通讯，资产(${transformNone(data.host)})请求 ${transformNone(data.url)}，受控指令：${transformNone(data.msg)}`
    }
  },
  {
    useKey: 'stype',
    useValue: 'OS_VUL',
    name: '系统漏洞',
    summary: function (data) {
      return `${getName(data, 'sys')}存在${this.name}`
    },
    oneString: function (data) {
      return `发现 ${transformNone(data.vul_name)}(${transformNone(data.cve_id)})，处置结果：${data.status === 'unfix' ? '未修复' : '已修复'}`
    }
  },
  {
    useKey: 'stype',
    useValue: 'WEB_VUL',
    name: 'Web应用漏洞',
    summary: function (data) {
      return `${getName(data, 'sys')}存在${this.name}`
    },
    oneString: function (data) {
      return `发现 ${transformNone(data.vul_name)}，处置结果：${data.status === 'unfix' ? '未修复' : '已修复'}`
    }
  },
  {
    useKey: 'stype',
    useValue: 'ILLEGAL-ACCESSS',
    name: '违规外联',
    summary: function (data) {
      return `${getName(data, 'sys')}存在${this.name}`
    },
    oneString: function (data) {
      return `${transformNone(data.host)} 请求 ${transformNone(data.url)}，处置动作：${data.action === 'deny' ? '拒绝' : '允许'}`
    }
  },
  {
    useKey: 'stype',
    useValue: 'ILLEGAL-USE',
    name: '违规接入',
    summary: function (data) {
      return `${getName(data, 'sys')}存在${this.name}`
    },
    oneString: function (data) {
      return `${transformNone(data.dev_name)} 接入资产(${transformNone(data.host)})，执行${transformNone(data.op)}，处置动作：${data.action === 'deny' ? '拒绝' : '允许'}`
    }
  },
  {
    useKey: 'stype',
    useValue: 'SYS-STATUS',
    name: '系统运行状态',
    summary: function (data) {
      let name = getName(data)
      return `${name === '' ? getName(data, 'sys') : name}${data.status === 1 ? '可用' : '不可用'}，最近一次响应时间 ${transformNone(data.ts)}`
    },
    oneString: function (data) {
      let name = getName(data)
      return `${name === '' ? getName(data, 'sys') : name}${data.status === 1 ? '可用' : '不可用'}，最近一次响应时间 ${transformNone(data.ts)}`
    }
  },
  {
    useKey: 'stype',
    useValue: 'DEV-STATUS',
    name: '设备运行状态',
    summary: function (data) {
      let name = getName(data)
      return `${name === '' ? getName(data, 'sys') : name}${data.status === 1 ? '可用' : '不可用'}，最近一次响应时间 ${transformNone(data.ts)}`
    },
    oneString: function (data) {
      let name = getName(data)
      return `${name === '' ? getName(data, 'sys') : name}${data.status === 1 ? '可用' : '不可用'}，最近一次响应时间 ${transformNone(data.ts)}`
    }
  },
  {
    useKey: 'stype',
    useValue: 'VUL',
    name: '脆弱性',
    summary: function (data) {
      return `发现 ${transformNone(data.vul_name)}(${transformNone(data.cve_id)})，处置结果：${data.status === 'unfix' ? '未修复' : '已修复'}`
    },
    oneString: function (data) {
      return `发现 ${transformNone(data.vul_name)}(${transformNone(data.cve_id)})，处置结果：${data.status === 'unfix' ? '未修复' : '已修复'}`
    }
  },
  {
    useKey: 'stype',
    useValue: 'DEV-AUDIT',
    name: '审计',
    summary: function (data) {
      let name = getName(data)
      if (name !== '') {
        return `${transformNone(data.user)}在 ${transformNone(data.ts)} 对${getName(data, 'sys')}下的${name}执行${transformNone(data.action)}，操作结果：${transformNone(data.result)}`
      } else {
        return `${transformNone(data.user)}在 ${transformNone(data.ts)} 对${getName(data, 'sys')}执行${transformNone(data.action)}，操作结果：${transformNone(data.result)}`
      }
    },
    oneString: function (data) {
      let name = getName(data)
      if (name !== '') {
        return `${transformNone(data.user)}在 ${transformNone(data.ts)} 对${getName(data, 'sys')}下的${name}执行${transformNone(data.action)}，操作结果：${transformNone(data.result)}`
      } else {
        return `${transformNone(data.user)}在 ${transformNone(data.ts)} 对${getName(data, 'sys')}执行${transformNone(data.action)}，操作结果：${transformNone(data.result)}`
      }
    }
  },
  {
    useKey: 'stype',
    useValue: 'LOAD_ANA',
    name: '载荷深度分析',
    summary: function (data) {
      if (data.final_result === 'black') {
        return `经深度分析设备鉴定，${transformNone(data.md5)}是黑样本，恶意代码名称为${transformNone(data.malname)}`
      } else {
        return `经深度分析设备鉴定，${transformNone(data.md5)}是白样本`
      }
    },
    oneString: function (data) {
      if (data.final_result === 'black') {
        return `经深度分析设备鉴定，${transformNone(data.file.md5)}是黑样本，恶意代码名称为${transformNone(data.malname)}`
      } else {
        return `经深度分析设备鉴定，${transformNone(data.file.md5)}是白样本`
      }
    }
  },
  {
    useKey: 'stype',
    useValue: 'MALCODE_TRANSTER',
    name: '恶意代码传输',
    summary: function (data) {
      return `${getName(data, 'sys')}存在${this.name}问题`
    },
    oneString: function (data) {
      return `资产(${transformNone(data.sip)})通过${transformNone(data.proto)}协议访问${transformNone(data.dip)}，发现 ${transformNone(data.md5)}等恶意代码传输行为，其恶意代码名称为${transformNone(data.malname)}`
    }
  },
  {
    userKey: 'stype',
    useValue: 'other',
    name: '',
    summary: function () {
      return '--'
    },
    oneString: function () {
      return '--'
    }
  }
]
/**
 * 获取对应类型的描述
 *
 * @param {Object} rawData  原始数据
 * @param {String} type  期望获得的描述的类型['des', 'summary']; 默认'des' 返回描述
 */
export const getOneStringDes = (rawData, type = 'des') => {
  let data = JSON.parse(JSON.stringify(rawData))
  let hasStype = false
  for (let idx = 0, len = desConfig.length; idx < len; idx++) {
    if (desConfig[idx].useValue === data['stype']) {
      hasStype = true
      if (type === 'des') {
        return desConfig[idx].oneString(data)
      } else if (type === 'summary') {
        return desConfig[idx].summary(data)
      } else if (type === 'name') {
        return desConfig[idx].name
      }
    }
  }
  if (!hasStype) {
    return desConfig[desConfig.length - 1].oneString()
  }
}
